//using System.Collections.Generic;
//using System.Xml;
//using Mbs.Services;
//using System;

//namespace Mbs.Modularity.AddIns
//{
//    [Serializable]
//    public class Condition : ICondition
//    {
//        private string name;
//        private ConditionFailedAction action;
//        private PropertySet configuration;

//        public Condition(string name, PropertySet configuration)
//        {
//            this.name = name;
//            this.configuration = configuration;
//            action = configuration.Get("Action", ConditionFailedAction.Exclude);
//        }

//        public string Id
//        {
//            get { return name; }
//        }

//        public ConditionFailedAction Action
//        {
//            get { return action; }
//            set { action = value; }
//        }

//        public string this[string key]
//        {
//            get { return configuration[key]; }
//        }

//        public bool IsValid(object caller)
//        {
//            // to do
//            return false;
//        }

//        public static ICondition Read(XmlReader reader)
//        {
//            PropertySet properties = PropertySet.ReadFromAttributes(reader);
//            string conditionName = properties["Id"];
//            return new Condition(conditionName, properties);
//        }

//        public static ICondition ReadComplexCondition(XmlReader reader)
//        {
//            PropertySet properties = PropertySet.ReadFromAttributes(reader);
//            reader.Read();
//            ICondition condition = null;
//            while (reader.Read())
//            {
//                switch (reader.NodeType)
//                {
//                    case XmlNodeType.Element:
//                        switch (reader.LocalName)
//                        {
//                            case "And":
//                                condition = AndCondition.Read(reader);
//                                goto exit;
//                            case "Or":
//                                condition = OrCondition.Read(reader);
//                                goto exit;
//                            case "Not":
//                                condition = NegatedCondition.Read(reader);
//                                goto exit;
//                            default:
//                                throw new AddInLoadException("Invalid element name '" + reader.LocalName
//                                                             + "', the first entry in a ComplexCondition " +
//                                                             "must be <And>, <Or> or <Not>");
//                        }
//                }
//            }
//        exit:
//            if (condition != null)
//            {
//                ConditionFailedAction action = properties.Get("Action", ConditionFailedAction.Exclude);
//                condition.Action = action;
//            }
//            return condition;
//        }

//        public static ICondition[] ReadConditionList(XmlReader reader, string endElement)
//        {
//            List<ICondition> conditions = new List<ICondition>();
//            while (reader.Read())
//            {
//                switch (reader.NodeType)
//                {
//                    case XmlNodeType.EndElement:
//                        if (reader.LocalName == endElement)
//                        {
//                            return conditions.ToArray();
//                        }
//                        break;
//                    case XmlNodeType.Element:
//                        switch (reader.LocalName)
//                        {
//                            case "And":
//                                conditions.Add(AndCondition.Read(reader));
//                                break;
//                            case "Or":
//                                conditions.Add(OrCondition.Read(reader));
//                                break;
//                            case "Not":
//                                conditions.Add(NegatedCondition.Read(reader));
//                                break;
//                            case "Condition":
//                                conditions.Add(Condition.Read(reader));
//                                break;
//                            default:
//                                throw new AddInLoadException("Invalid element name '" + reader.LocalName
//                                                             + "', entries in a <" + endElement + "> " +
//                                                             "must be <And>, <Or>, <Not> or <Condition>");
//                        }
//                        break;
//                }
//            }
//            return conditions.ToArray();
//        }


//        public static ConditionFailedAction GetFailedAction(IEnumerable<ICondition> conditionList, object caller)
//        {
//            ConditionFailedAction action = ConditionFailedAction.Nothing;
//            foreach (ICondition condition in conditionList)
//            {
//                if (!condition.IsValid(caller))
//                {
//                    if (condition.Action == ConditionFailedAction.Disable)
//                    {
//                        action = ConditionFailedAction.Disable;
//                    }
//                    else
//                    {
//                        return ConditionFailedAction.Exclude;
//                    }
//                }
//            }
//            return action;
//        }
//    }
//}
